package com.woniuxy.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 * Author: 马宇航
 * Do: 这个配置文件中，需要配置1个正常的交换机，2个正常队列。 配置一个死信交换机和一个死信队列。
 * DateTime: 22/07/07/0007 上午 10:33
 * Component: 成都蜗牛学苑
 * <img src="https://woniumd.oss-cn-hangzhou.aliyuncs.com/java/mayuhang/202207071131655.png"/>
 **/
@Configuration
public class NormalDeathConfig {
    /*  正常配置 *******开始*******************************************************/
    @Bean("ddExchange")
    public DirectExchange directExchange(){
        return new DirectExchange("normalExchange");
    }
    //正常的队列，设置属性，队列长度为5
    @Bean
    public Queue normalQueue(){
        //封装参数配置,调用的都是死信交换机配置方法。
        Map args = deathQueueArgs();
        //设置队列长度为5个，超过5个怎么办？还没配 还需要手动指定连接到哪个死信队列上
        args.put("x-max-length",5);
        return new Queue("normal5Queue",true,false,false,args);
    }
    //有过期时间的队列
    @Bean
    public Queue ttlQueue(){
        //封装参数配置
        Map<String, Object> args = deathQueueArgs();
        //设置消息过期时间为30s
        args.put("x-message-ttl",30*1000);
        return new Queue("ttlQueue",true,false,false,args);
    }
    //bingding 绑定交换机和第一个正常队列 测试长度
    @Bean
    public Binding normalRoutingKeyBinding(){
        return BindingBuilder.bind(normalQueue()).to(directExchange()).with("normalRouting");
    }
    //bingding 绑定交换机和第二个过期时间消息队列
    @Bean
    public Binding ttlRoutingKeyBinding(){
        return BindingBuilder.bind(ttlQueue()).to(directExchange()).with("ttlRouting");
    }
    /*  正常配置 *******结束*******************************************************/
    /*  死信配置 *******开始*******************************************************/
    @Bean
    public DirectExchange deathExchange(){
        return new DirectExchange("deathExchange",true,false);
    }
    @Bean
    public Queue deathQueue(){
        return new Queue("deathQueue",true,false,false);
    }
    //binding
    @Bean
    public Binding deathRoutingKeyBinding(){
        return BindingBuilder.bind(deathQueue()).to(deathExchange()).with("deathRouting");
    }
    /*  死信配置 *******结束*******************************************************/
    //正常对列和死信队列进行绑定 的配置
    public Map deathQueueArgs(){
        Map args = new HashMap();
        //配置死信交换机的参数，因为死信交换机也是个正常交换机，所以需要指定这个配置
        args.put("x-dead-letter-exchange","deathExchange");
        args.put("x-dead-letter-routing-key","deathRouting");
        return args;
    }
}
